# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/10/7
# @File : 19.F - LCS.py
# 子序列是可以不连续的，子串是一定要连续的
def dp_solve():
    dp = [[0]*(n+1) for _ in range(m+1)]#初始化，空和空的LCS长度设定为0；
    #填表求LCS的长度的动态规划
    for i in range(1,m+1):
        for j in range(1,n+1):
            if(s[j-1] == t[i-1]):
                dp[i][j] = dp[i-1][j-1]+1
            else:
                dp[i][j] = max(dp[i-1][j],dp[i][j-1])
    #构造一个LCS的策略：从表的右下角开始回溯，当箭头是斜上的时候，表示s[j]和t[i]相同；是LCS中的一个元素
    len_ans = dp[-1][-1]
    i = m
    j = n
    ans = [""]*(len_ans+1)

    while len_ans > 0:
        if(s[j-1] == t[i-1]):
            ans[len_ans] = s[j-1]
            i -= 1
            j -= 1
            len_ans -= 1
        elif(dp[i][j] == dp[i][j-1]):#往左，一个往左就都往左。根据同一个序列来，往左就是根据s。不能一会根据s一会根据t。
            j -= 1
        else:
            i -= 1

    print("".join(ans))

"""
dp[i][j]表示s中前j个和t中前i个的LCS的长度。
状态转移：如果当前s[j]和t[i]相同，则可以加入到子序列中，所以dp[i][j]=dp[i-1][j-1]+1
        如果当前s[j]和t[i]不相同，则看要当前的s[j]不要当前的t[i]，和要当前的t[i]不要当前的s[j] 两者哪个大。
        dp[i][j] = max(dp[i-1][j],dp[i][j-1])。
        s[j]和t[i]两个都不选这种情况已经包含在里面了。
"""
if __name__ == '__main__':
    s = input()
    t = input()
    n = len(s)
    m = len(t)
    dp_solve()